let arr = ['hello', 'name'];
for(const [key, value] of Object.entries(arr)) {
    // console.log('arr:', item, Object.entries(arr));
    console.log('arr:', key, value);
};

let user = {
    name: 'zhangsan',
    age: 0,
    color: 'red'
};
// console.log(JSON.stringify(arr, ['name', 'color'], 4));

// console.log(JSON.stringify(user, (key, value) => {
//     if (key === 'color') return undefined;
//     return value;
// }, 4));


// 查看对象的属性特征---- 说明属性也是一个对象
console.log('查看user对象上name属性（getOwnPropertyDescriptor）：',
 Object.getOwnPropertyDescriptor(user, 'name'), Object.keys(user));


// 修改、配置对象的属性特征
Object.defineProperty(user, 'name', {
    configurable: true,// 决定能否被删除或重新定义属性特征
    writable: false, // 决定能否被修改
    value: 'zhoumingle',
    enumerable: false // 决定能否被Object.keys()、循环枚举出来
});

console.log('修改、配置对象的属性特征(Object.defineProperty)--before:', user, Object.keys(user));
user.name = 'lsi';// 不生效
delete user.name;// 不生效
console.log('修改、配置对象的属性特征(Object.defineProperty)--after:', user);
for(let key in user) {
    // 无法遍历出name属性因为enumerable: false
    console.log('for-in-user:', key);
}

// 批量定义属性特征
Object.defineProperties(user, {
    name: {
        configurable: true,
        value: '周明乐',
        enumerable: false,
        writable: true
    },
    age: {
        configurable: true,
        writable: false,
        value: 23,
        enumerable: true
    }
});
// delete user.name;// 生效， 因为configurable: true
console.log('批量修改、配置对象的属性特征(Object.defineProperties)--after:', user);


// 不予许拓展对象的属性（可以修改、删除）
Object.preventExtensions(user);
user.hobby = 'paly game'; // 不生效 因为user已经不可以拓展了
user.name = 'hello'; // 生效
delete user.age; // 生效
console.log('不予许拓展对象的属性(preventExtension):', user, Object.isExtensible(user));




// 封闭对象（整个对象就会不可添加或者删除--但是他是可以修改值的）
let dog = {
    name: 'xiaouang',
    age: 3,
    like: 'eat'
};
dog.name = '小白';
delete dog.age;
console.log('封闭对象（整个对象就会不可添加、删除，但是可以修改）seal---before:', dog);
Object.seal(dog);
dog.name = '笑话'; // 生效
dog.age  = 9; // 不生效
delete dog.name;// 不生效
console.log('封闭对象（整个对象就会不可添加、删除但是可以修改）seal---after:', dog, Object.isSealed(dog));


// 冻结对象，不可以增加、删除、修改
let cat = {
    name: '咪咪',
    age: 8,
    like: 'fish'
};
Object.freeze(cat);
cat.name = 'mimi'; // 不生效
cat.color = 'yellow'; // 不生效
delete cat.age; // 不生效
console.log( '冻结对象，不可以增加、删除、修改(freeze):', Object.isFrozen(cat), cat)










